package main

import "fmt"

//	func   函数名（形参列表)（返回值类型列表）{
//		执行语句..
//		return + 返回值列表
//	}
//
// 自定义函数：功能：两个数相加：
func cal(num1 int, num2 int) int { //如果返回值类型就一个的话，那么()是可以省略不写的
	var sum int = 0
	sum += num1
	sum += num2
	return sum
}
func cal2(num1 int, num2 int) (int, int) { //如果返回值类型就一个的话，那么()是可以省略不写的
	var sum int = 0
	sum += num1
	sum += num2
	return sum, num1 - num2
}

// 定义一个函数，函数的参数为：可变参数 ...  参数的数量可变
// args...int 可以传入任意多个数量的int类型的数据  传入0个，1个，，，，n个
func test(args ...int) {
	//函数内部处理可变参数的时候，将可变参数当做切片来处理
	//遍历可变参数：
	for i := 0; i < len(args); i++ {
		fmt.Println(args[i])
	}
}

// 指针是可以修改值的
func testPoint(num *int) {
	*num = 100
}
func main() {
	//功能：10 + 20
	//调用函数：
	sum := cal(10, 20)
	// 在Go语言中，defer后面的语句在当前函数执行完毕后才会执行，无论函数是正常返回还是发生异常。如果方法抛出异常，defer语句仍然会执行。
	// defer语句的执行顺序是后进先出的，也就是说最后一个defer语句会最先执行，依此类推。defer语句通常用于资源释放、文件关闭、解锁操作等
	defer fmt.Println(sum)
	// var num1 int = 10
	// var num2 int = 20
	//求和：
	// var sum int = 0
	// sum += num1
	// sum += num2
	// fmt.Println(sum)
	//功能：30 + 50
	var num3 int = 30
	var num4 int = 50
	//调用函数：
	sum1 := cal(num3, num4)
	fmt.Println(sum1)
	sum2, sum3 := cal2(num3, num4)
	fmt.Println(sum2, sum3)
	sum4, _ := cal2(num3, num4) // - 代表可以忽略的值
	fmt.Println(sum4)
	//求和：
	// var sum1 int = 0
	// sum1 += num3
	// sum1 += num4
	// fmt.Println(sum1)
	a := test
	a(1)
	fmt.Printf("函数类型%T  %T", a, test)
	sub := func(a1 int, a2 int) int {
		return a1 + a2
	}(10, 20) // 匿名函数
	fmt.Println(sub)
}
